/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package proy1sistdistribuidos.modelo;

import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.annotations.XStreamOmitField;
import com.thoughtworks.xstream.io.xml.DomDriver;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.PrintWriter;
import java.nio.Buffer;
import java.util.TreeMap;

/**
 *
 * @author jf.garcia50
 */
public class EstructuraDatosEstado {

    private EstadoGeneral estadoGeneralInicial;
    private TreeMap<String, EstadoGeneral> estadoGlobalDescarga;
    @XStreamOmitField
    private XStream xstream;

    public EstructuraDatosEstado() {
        if(xstream == null){
            xstream = new XStream(new DomDriver());
            registrarClasesXML(xstream);
        }
    }

    public EstructuraDatosEstado(EstadoGeneral estadoGeneralInicial, TreeMap<String, EstadoGeneral> estadoGlobalDescarga) {
        this.estadoGeneralInicial = estadoGeneralInicial;
        this.estadoGlobalDescarga = estadoGlobalDescarga;

        if(xstream == null){
            xstream = new XStream(new DomDriver());
            registrarClasesXML(xstream);
        }
    }

    public EstructuraDatosEstado(String estructuraXML) {
        if(xstream == null){
            xstream = new XStream(new DomDriver());
            registrarClasesXML(xstream);
        }
        EstructuraDatosEstado estructura = (EstructuraDatosEstado) xstream.fromXML(estructuraXML);
        this.estadoGeneralInicial = estructura.getEstadoGeneralInicial();
        this.estadoGlobalDescarga = estructura.getEstadoGlobalDescarga();
    }

    public void registrarClasesXML(XStream xstream){
        xstream.alias("EstadoGeneral", EstadoGeneral.class);
        xstream.alias("EstructuraDatosEstado", this.getClass());
        xstream.omitField(this.getClass(), "xstream");
    }

    public String aString(){
        return xstream.toXML(this);
    }

    public void persistirEstructura(String rutaFisica)throws Exception{
        File archivo = new File(rutaFisica);
        FileOutputStream out = new FileOutputStream(archivo,false);
        PrintWriter print = new PrintWriter(out);
        print.print(this.aString());
        print.close();
        out.close();
    }

    public void cargarEstructura(String ruta) throws Exception {
        if (xstream == null) {
            xstream = new XStream(new DomDriver());
            registrarClasesXML(xstream);
        }

        File archivo = new File(ruta);
        if (archivo.exists()) {
            FileReader in = new FileReader(archivo);
            BufferedReader reader = new BufferedReader(in);
            String linea = "";
            String archivoXML = "";
            while((linea = reader.readLine()) != null){
                archivoXML+=linea;
            }

            reader.close();
            in.close();
            if(!archivoXML.equals("")){
                EstructuraDatosEstado estructura = (EstructuraDatosEstado) xstream.fromXML(archivoXML);
                this.estadoGeneralInicial = estructura.getEstadoGeneralInicial();
                this.estadoGlobalDescarga = estructura.getEstadoGlobalDescarga();
            }else{
                this.estadoGeneralInicial = null;
                this.estadoGlobalDescarga = null;
            }

            
        }



    }

    /**
     * @return the estadoGeneralInicial
     */
    public EstadoGeneral getEstadoGeneralInicial() {
        return estadoGeneralInicial;
    }

    /**
     * @param estadoGeneralInicial the estadoGeneralInicial to set
     */
    public void setEstadoGeneralInicial(EstadoGeneral estadoGeneralInicial) {
        this.estadoGeneralInicial = estadoGeneralInicial;
    }

    /**
     * @return the estadoGlobalDescarga
     */
    public TreeMap<String, EstadoGeneral> getEstadoGlobalDescarga() {
        return estadoGlobalDescarga;
    }

    /**
     * @param estadoGlobalDescarga the estadoGlobalDescarga to set
     */
    public void setEstadoGlobalDescarga(TreeMap<String, EstadoGeneral> estadoGlobalDescarga) {
        this.estadoGlobalDescarga = estadoGlobalDescarga;
    }




}
